// 详细的晶体模式原子隐藏/显示功能测试
console.log('=== 详细的晶体模式原子隐藏/显示功能测试 ===')

// 模拟测试数据 - 硅晶体结构
const testStructure = {
  material_id: 'mp-20411',
  sites: [
    { species: ['Si'], xyz: [0.0, 0.0, 0.0], label: 'Si1' },
    { species: ['Si'], xyz: [0.25, 0.25, 0.25], label: 'Si2' },
    { species: ['O'], xyz: [0.5, 0.5, 0.5], label: 'O1' },
    { species: ['O'], xyz: [0.75, 0.75, 0.75], label: 'O2' }
  ],
  lattice: {
    a: 5.43,
    b: 5.43,
    c: 5.43,
    alpha: 90,
    beta: 90,
    gamma: 90
  }
}

// 模拟隐藏元素集合
const hiddenElements = new Set()

// 模拟场景中的原子对象
let sceneAtoms = []

// 模拟 renderExtendedAtoms 函数
function renderExtendedAtoms (atoms, lattice, unitCells = 1) {
  console.log(`渲染扩展原子 (${unitCells}x${unitCells}x${unitCells} 晶胞)`)

  const a = lattice.a
  const b = lattice.b
  const c = lattice.c
  const range = Math.floor(unitCells / 2)

  let atomsCreated = 0

  for (let i = -range; i <= range; i++) {
    for (let j = -range; j <= range; j++) {
      for (let k = -range; k <= range; k++) {
        atoms.forEach((atom) => {
          let elementSymbol = ''

          if (atom.species && atom.species.length > 0) {
            elementSymbol = atom.species[0]
          } else if (atom.label) {
            elementSymbol = atom.label.replace(/[0-9+-]/g, '')
          }

          if (!elementSymbol) elementSymbol = 'Si'

          // 将分数坐标转换为笛卡尔坐标，并扩展到多个晶胞
          const x = (atom.xyz[0] + i - 0.5) * a
          const y = (atom.xyz[1] + j - 0.5) * b
          const z = (atom.xyz[2] + k - 0.5) * c

          // 创建原子对象
          const atomObj = {
            element: elementSymbol,
            position: { x, y, z},
            visible: !hiddenElements.has(elementSymbol)
          }

          sceneAtoms.push(atomObj)
          atomsCreated++

          console.log(`创建 ${elementSymbol} 原子在位置 (${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}) - 可见: ${atomObj.visible}`)
        })
      }
    }
  }

  console.log(`总共创建了 ${atomsCreated} 个原子`)
  return atomsCreated
}

// 模拟 toggleElementVisibility 函数
function toggleElementVisibility (element, crystalMode = false) {
  console.log(`\n切换元素 ${element} 的可见性 (晶体模式: ${crystalMode})`)

  if (hiddenElements.has(element)) {
    // 显示该元素的所有原子
    hiddenElements.delete(element)
    console.log(`显示元素 ${element}`)

    if (crystalMode) {
      console.log('晶体模式: 重新渲染整个分子')
      // 在晶体模式下，重新渲染整个分子
      sceneAtoms = []; // 清空场景
      renderExtendedAtoms(testStructure.sites, testStructure.lattice, 3)
    } else {
      console.log('非晶体模式: 重新创建该元素的原子')
      // 重新设置该元素原子的可见性
      sceneAtoms.forEach(atom => {
        if (atom.element === element) {
          atom.visible = true
          console.log(`设置 ${element} 原子可见`)
        }
      })
    }
  } else {
    // 隐藏该元素的所有原子
    hiddenElements.add(element)
    console.log(`隐藏元素 ${element}`)

    // 设置该元素原子的可见性为 false
    sceneAtoms.forEach(atom => {
      if (atom.element === element) {
        atom.visible = false
        console.log(`设置 ${element} 原子不可见`)
      }
    })
  }

  console.log('当前隐藏的元素:', Array.from(hiddenElements))
  console.log('场景中原子状态:')
  sceneAtoms.forEach((atom, index) => {
    if (index < 10) { // 只显示前10个原子
      console.log(`  ${atom.element} - 位置: (${atom.position.x.toFixed(2)}, ${atom.position.y.toFixed(2)}, ${atom.position.z.toFixed(2)}) - 可见: ${atom.visible}`)
    }
  })
}

// 测试用例
console.log('=== 测试开始 ===')

// 初始渲染
console.log('\n1. 初始渲染 (3x3x3 晶胞)')
renderExtendedAtoms(testStructure.sites, testStructure.lattice, 3)

// 测试1: 隐藏硅原子
console.log('\n2. 测试1: 隐藏硅原子')
toggleElementVisibility('Si', true)

// 测试2: 再次点击硅原子（应该显示）
console.log('\n3. 测试2: 再次点击硅原子（应该显示）')
toggleElementVisibility('Si', true)

// 测试3: 隐藏氧原子
console.log('\n4. 测试3: 隐藏氧原子')
toggleElementVisibility('O', true)

// 测试4: 再次点击氧原子（应该显示）
console.log('\n5. 测试4: 再次点击氧原子（应该显示）')
toggleElementVisibility('O', true)

// 统计结果
console.log('\n=== 测试结果统计 ===')
const visibleAtoms = sceneAtoms.filter(atom => atom.visible)
const hiddenAtoms = sceneAtoms.filter(atom => !atom.visible)

console.log(`总共原子数: ${sceneAtoms.length}`)
console.log(`可见原子数: ${visibleAtoms.length}`)
console.log(`隐藏原子数: ${hiddenAtoms.length}`)

// 按元素统计
const elementStats = {}
sceneAtoms.forEach(atom => {
  if (!elementStats[atom.element]) {
    elementStats[atom.element] = { total: 0, visible: 0, hidden: 0 }
  }
  elementStats[atom.element].total++
  if (atom.visible) {
    elementStats[atom.element].visible++
  } else {
    elementStats[atom.element].hidden++
  }
})

console.log('\n按元素统计:')
Object.entries(elementStats).forEach(([element, stats]) => {
  console.log(`  ${element}: 总数=${stats.total}, 可见=${stats.visible}, 隐藏=${stats.hidden}`)
})

console.log('\n=== 测试完成 ===')
